package com.szj.shiro1;

import java.util.Arrays;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.Test;

public class ShiroApplication {

	/*
	 * shiro.ini
	 * 使用配置文件中的用户信息
	 */
	@Test
	public void testLogByIni() {
		System.out.println("***************shiro.ini 开始*****************");
		//1、创建SecurityManager工厂对象：加载配置文件，创建工厂对象
		Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");
		
		//2、通过工厂对象，创建SecurityManager
		SecurityManager manager=factory.getInstance();
		
		//3、将securityManager绑定到当前运行环境中，让系统随时随地的都可以访问securityManager对象
		SecurityUtils.setSecurityManager(manager);
		
		//4、创建当前登录的主体，注意：此时主体没有经过认证
		Subject subject=SecurityUtils.getSubject();
		
		//5、收集主体登录的身份/凭证，即账号、密码（参数1：用户名，参数2：密码）
		UsernamePasswordToken token=new UsernamePasswordToken("zhangsan","111");
		
		//6、主体登录认证
		subject.login(token);
		
		System.out.println("验证登陆是否成功==="+subject.isAuthenticated());
		
		//7、登出 注销
		subject.logout();
		
		System.out.println("验证登陆是否成功==="+subject.isAuthenticated());
		
	}
	
	/*
	 * shiro-realm.ini
	 * 使用数据库中的用户信息
	 */
	@Test
	public void testLogByRealms() {
		System.out.println("****************shiro-realm 开始****************");
		//1、创建SecurityManager工厂对象：加载配置文件，创建工厂对象
		Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-realm.ini");
		
		//2、通过工厂对象，创建SecurityManager
		SecurityManager manager=factory.getInstance();
		
		//3、将securityManager绑定到当前运行环境中，让系统随时随地的都可以访问securityManager对象
		SecurityUtils.setSecurityManager(manager);
		
		//4、创建当前登录的主体，注意：此时主体没有经过认证
		Subject subject=SecurityUtils.getSubject();
		
		//5、收集主体登录的身份/凭证，即账号、密码（参数1：用户名，参数2：密码）
		UsernamePasswordToken token=new UsernamePasswordToken("zhangsan","111");
		
		//6、主体登录认证
		subject.login(token);
		
		System.out.println("验证登陆是否成功==="+subject.isAuthenticated());
		
		//7、登出 注销
		subject.logout();
		
		System.out.println("验证登陆是否成功==="+subject.isAuthenticated());
		
	}
	
	
	/*
	 * shiro-md5-realm.ini
	 * 使用数据库中的用户信息，密码为加密的密码
	 */
	@Test
	public void testLogByMd5Realms() {
		System.out.println("*************shiro-md5-realm 开始****************");
		//1、创建SecurityManager工厂对象：加载配置文件，创建工厂对象
		Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-md5-realm.ini");
		
		//2、通过工厂对象，创建SecurityManager
		SecurityManager manager=factory.getInstance();
		
		//3、将securityManager绑定到当前运行环境中，让系统随时随地的都可以访问securityManager对象
		SecurityUtils.setSecurityManager(manager);
		
		//4、创建当前登录的主体，注意：此时主体没有经过认证
		Subject subject=SecurityUtils.getSubject();
		
		//5、收集主体登录的身份/凭证，即账号、密码（参数1：用户名，参数2：密码）
		UsernamePasswordToken token=new UsernamePasswordToken("zhangsan","111");
		
		//6、主体登录认证
		subject.login(token);
		
		System.out.println("验证登陆是否成功==="+subject.isAuthenticated());
		
		//7、登出 注销
		subject.logout();
		
		System.out.println("验证登陆是否成功==="+subject.isAuthenticated());
		
	}
	
	/*
	 * shiro-permission.ini
	 * 判断用户是否拥有角色
	 */
	@Test
	public void testLogByRole() {
		System.out.println("****************shiro-permission role开始****************");
		Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-permission.ini");
		SecurityManager manager=factory.getInstance();
		SecurityUtils.setSecurityManager(manager);
		Subject subject=SecurityUtils.getSubject();
		UsernamePasswordToken token=new UsernamePasswordToken("zhangsan","111");
		subject.login(token);
		
		//判断是否拥有角色
		//进行授权操作时的前提：用户必须通过认证
		
		//判断方式1（会有返回值）
		//判断用户是否拥有某个角色：拥有则返回true，不拥有返回false
		System.out.println(subject.hasRole("role1"));
		
		//判断用户是否拥有一些角色：返回true表示全部拥有，false表示不全部拥有（拥有一部分,或者都不拥有）
		System.out.println(subject.hasAllRoles(Arrays.asList("role1","role3")));
		
		//判断用户是否拥有一些角色：返回boolean数组，拥有的返回true，不拥有的返回false
		System.out.println(Arrays.toString(subject.hasRoles(Arrays.asList("role1","role3"))));
		
		
		//判断方式2（没有返回值）
		
		//判断当前用户是否拥有某个角色：拥有：无返回值，不拥有：抛出异常(UnauthorizedException)
		subject.checkRole("role1");
		//判断当前用户是否拥有一些角色
		subject.checkRoles("role1","role2");
		
		
	}
	
	
	/*
	 * shiro-permission.ini
	 * 判断用户是否拥有权限
	 */
	@Test
	public void testLogByPermission() {
		System.out.println("****************shiro-permission permission开始****************");
		Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-permission.ini");
		SecurityManager manager=factory.getInstance();
		SecurityUtils.setSecurityManager(manager);
		Subject subject=SecurityUtils.getSubject();
		UsernamePasswordToken token=new UsernamePasswordToken("zhangsan","111");
		subject.login(token);
		
		//判断是否拥有权限（同角色判断）
		//进行授权操作时的前提：用户必须通过认证
		
		//判断方式1（会有返回值）
		//判断用户是否拥有某个权限：拥有则返回true，不拥有返回false
		System.out.println(subject.isPermitted("user:create"));
		
		//判断用户是否拥有一些权限：返回boolean数组，拥有的返回true，不拥有的返回false
		System.out.println(Arrays.toString(subject.isPermitted("user:create","user:list")));
		
		//判断用户是否拥有一些权限：返回true表示全部拥有，false表示不全部拥有（拥有一部分,或者都不拥有）
		System.out.println(subject.isPermittedAll("user:create","user:list"));
		
		
		//判断方式2（没有返回值）
		
		//判断当前用户是否拥有某个权限：拥有：无返回值，不拥有：抛出异常(UnauthorizedException)
		subject.checkPermission("user:create");
		//判断当前用户是否拥有一些角色
		subject.checkPermissions("user:create","user:list");
		
	}
	
}
